package jrain.utils.lang;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * <pre>
 * 作者：489088214@qq.com 
 * 描述： 字符串工具类
 * </pre>
 */
public class StringUtils {

	/**
	 * 判断对象是否为数值类型
	 * @param str 字符串
	 * @return 是否数值
	 */
	public boolean isNumStr(String str) {
		for (int i = 0; i < str.length(); i++) {
			if (!Character.isDigit(str.charAt(i))) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断对象是否为空
	 * @param object 对象
	 * @return boolean 是否为空
	 */
	public static boolean isEmpty(Object object) {
		if (object == null) {
			return true;
		}
		if (object instanceof String) {
			String value = (String) object;
			if ("".equals(value.trim())) {
				return true;
			}
			return false;
		}
		if (object instanceof Collection<?>) {
			Collection<?> list = (Collection<?>) object;
			if (list.size() == 0) {
				return true;
			}
			return false;
		}
		if (object instanceof Object[]) {
			Object[] objs = (Object[]) object;
			if (objs.length == 0) {
				return true;
			}
			return false;
		}
		if (object instanceof Map) {
			Map<?, ?> map = (Map<?, ?>) object;
			if (map.size() == 0) {
				return true;
			}
			return false;
		}
		return false;
	}

	/**
	 * 判断对象是否为数值空
	 * @param object 对象
	 * @return 是否为空
	 */
	public static boolean isEmptyZero(Object object) {
		if (object == null) {
			return true;
		}
		if (object instanceof String) {
			String value = ((String) object).trim();
			if ("".equals(value) || "0".equals(value)) {
				return true;
			}
			return false;
		}
		if (object instanceof Number) {
			return (((Number) object).intValue() == 0);
		}
		if (object instanceof Collection<?>) {
			Collection<?> list = (Collection<?>) object;
			if (list.size() == 0) {
				return true;
			}
			return false;
		}
		if (object instanceof Object[]) {
			Object[] objs = (Object[]) object;
			if (objs.length == 0) {
				return true;
			}
			return false;
		}
		return false;
	}

	/**
	 * 删除字符串中的空格
	 * @param str 字符串
	 * @return 去除空格后的字符串
	 */
	public static String removeSpaces(String str) {
		StringBuffer sb = new StringBuffer();
		if (str != null && !"".equals(str = str.trim())) {
			StringTokenizer st = new StringTokenizer(str, " ", false);
			while (st.hasMoreElements()) {
				sb.append(st.nextElement());
			}
		}
		return sb.toString();
	}

	/**
	 * 获取截取后字符串
	 * @param object 对象
	 * @return 取截取后字符串
	 */
	public static String trimNull(Object object) {
		return trimNull(object, "");
	}

	/**
	 * 获取截取后字符串
	 * @param object 对象
	 * @param defaultValue 默认值
	 * @return 取截取后字符串
	 */
	public static String trimNull(Object object, String defaultValue) {
		if (object == null) {
			return defaultValue;
		}
		if (object instanceof String) {
			String str = ((String) object).trim();
			if (str.length() == 0) {
				return defaultValue;
			} else {
				return str;
			}
		}
		return object.toString();
	}

	/**
	 * 左边填充字符串
	 * @param str 字符串
	 * @param fillChar 填充字符
	 * @param length 长度
	 * @return 填充后的字符串
	 */
	public static String fillLeft(String str, char fillChar, int length) {
		str = trimNull(str);
		int subLen = str.length();
		String rsStr = "";
		for (int i = 0; i < length - subLen; i++) {
			rsStr += String.valueOf(fillChar);
		}
		rsStr = rsStr + str;
		return rsStr;
	}

	/**
	 * 右边填充字符串
	 * @param str 字符串
	 * @param fillChar 填充字符
	 * @param length 长度
	 * @return 填充后的字符串
	 */
	public static String fillReight(String str, char fillChar, int length) {
		str = trimNull(str);
		int subLen = str.length();
		String rsStr = str;
		for (int i = 0; i < length - subLen; i++) {
			rsStr += String.valueOf(fillChar);
		}
		return rsStr;
	}

	/**
	 * 首字符大写
	 * @param str 字符串
	 * @return 字符串
	 */
	public static String firtCharToUp(String str) {
		if (str != null) {
			str = str.substring(0, 1).toUpperCase() + str.substring(1);
		}
		return str;
	}

	/**
	 * 将列名转换为字段名
	 * @param columnName 列名称
	 * @return 字段名
	 */
	public static String columnToField(String columnName) {
		String strs[] = columnName.toLowerCase().split("_");
		if (strs != null) {
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < strs.length; i++) {
				String str = strs[i];
				if (i != 0) {
					str = firtCharToUp(str);
				}
				sb.append(str);
			}
			return sb.toString();
		}
		return columnName;
	}

	/**
	 * 字段名转换为列名
	 * @param fieldName 字段名
	 * @return 列名称
	 */
	public static String fieldToColumn(String fieldName) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < fieldName.length(); i++) {
			char c = fieldName.charAt(i);
			String cStr = String.valueOf(c);
			if (c >= 65 && c <= 95) {
				sb.append("_");
				sb.append(cStr);
			} else {
				sb.append(cStr);
			}
		}
		return sb.toString().toLowerCase();
	}

	/**
	 * 表名称转类名称
	 * @param columnName 表名称
	 * @return 类名称
	 */
	public static String tableToClass(String columnName) {
		String strs[] = columnName.toLowerCase().split("_");
		if (strs != null) {
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < strs.length; i++) {
				String str = strs[i];
				str = firtCharToUp(str);
				sb.append(str);
			}
			return sb.toString();
		}
		return columnName;
	}

	/**
	 * 类名称转换表名称
	 * @param className 类名称
	 * @return 表名称
	 */
	public static String classToTable(String className) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < className.length(); i++) {
			char c = className.charAt(i);
			String cStr = String.valueOf(c);
			if (c >= 65 && c <= 95) {
				if (i != 0) {
					sb.append("_");
				}
				sb.append(cStr);
			} else {
				sb.append(cStr);
			}
		}
		return sb.toString().toLowerCase();
	}

	/**
	 * 字符串转数组
	 * @param str 字符串
	 * @return 数组
	 */
	public static String[] split(String str) {
		return split(str, ",");
	}

	/**
	 * 字符串转数组
	 * @param str 字符串
	 * @param split 分隔符
	 * @return 数组
	 */
	public static String[] split(String str, String split) {
		List<String> list = new ArrayList<String>();
		str = StringUtils.trimNull(str);
		if (!StringUtils.isEmpty(str)) {
			String[] strs = str.split(split);
			if (!StringUtils.isEmpty(strs)) {
				for (String string : strs) {
					string = StringUtils.trimNull(string);
					if (!StringUtils.isEmpty(string)) {
						list.add(string);
					}
				}
			}
		}
		return list.toArray(new String[] {});
	}
}
